﻿using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using System.Threading;
using System.Windows.Controls;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using ExamSharedClasses;
using ExamSharedClasses.Commands;

namespace ExamServer {

    /// <summary>
    /// (k) Die ist das einzige Fenster des Servers; es enthält
    /// Logausgaben und ein Liste mit angemeldeten Nutzern.
    /// </summary>
    public partial class ServerMainWindow : Window {

        public ServerMainWindow() {
            InitializeComponent();
            App.ServerMainWindow = this;
            App.LogStringQueue = new Queue<string>();
            App.Display( "Server (Version " + App.VERSION + ") gestartet..." );

            // die "Hauptreferenzen" initialisieren
            App.ClientConnection = new ClientConnection();

            App.ClientConnectionThreadList = new ClientConnectionThreadList();
            App.DatabaseConnection = new DatabaseConnection();
            App.IsLoginAllowed = true; // Login erlauben?

            // sekündliches GUI-Update durch DispatchTimer-Klasse ermöglichen
            ( App.dispatcherTimer = new DispatcherTimer() ).Tick += new EventHandler( UpdateGUI );
            App.dispatcherTimer.Interval = new TimeSpan( 0, 0, 0, 1, 0 ); // 1s

            App.ClientConnection.Start();
            App.dispatcherTimer.Start();

        }

        public void Shutdown() {
            // Die Verbindungen der angemeldeten Nutzer schließen
            App.ClientConnectionThreadList.Close();
            
            // Den VerbinderThread schließen
            if ( App.ClientConnection != null )
                App.ClientConnection.Close();

            // Die Sekunden-Timer
            if ( App.dispatcherTimer != null )
                App.dispatcherTimer.Stop();

            // Die Anwendung beenden
            App.Current.Shutdown();
        }
        
        private void shutdownButton_Click( object sender, RoutedEventArgs e ) {
            Shutdown();
        }
        private void clearLogButton_Click( object sender, RoutedEventArgs e ) {
            App.LogStringQueue.Clear();
        }
        private void blockButton_Click( object sender, RoutedEventArgs e ) {
            if ( blockButton.Content.Equals( "Sperren" ) ) {
                App.Display( "Neue Verbindungen werden abgelehnt!" );
                blockButton.Content = "Entsperren";
                App.IsLoginAllowed = false;
            } else {
                App.Display( "Neue Verbindungen werden wieder angenommen." );
                blockButton.Content = "Sperren";
                App.IsLoginAllowed = true;
            }
        }

        /// <summary>
        /// (k) Hier werden sekündlich die Fensterelemente mit frischen Daten versehen,
        /// die aus statischen Listen aus der App-Klasse kommen.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void UpdateGUI( object sender, EventArgs e ) {

            while ( App.LogStringQueue.Count != 0 ) {
                ListBoxItem listBoxItem = new ListBoxItem();
                listBoxItem.Content = App.LogStringQueue.Dequeue();
                logList.Items.Insert( 0, listBoxItem );
            }

            foreach ( string logEntry in App.LogStringQueue ) {
                logList.Items.Insert( 0, logEntry );
            }

            /// Den Userstatus an Dozenten und Admins übermitteln
            /// aber nur alle fünf Sekunden
            if ( DateTime.Now.Second == 5 || DateTime.Now.Second == 0 ) {
                userList.Items.Clear();
                App.ClientConnectionThreadList.BroadcastUserStatus();
            }

            

            if ( App.IsLoginAllowed )
                readyForConnectionIndicator.Background = new SolidColorBrush( System.Windows.Media.Color.FromRgb( 0, 255, 0 ) );
            else
                readyForConnectionIndicator.Background = new SolidColorBrush( System.Windows.Media.Color.FromRgb( 255, 0, 0 ) );

        }

 

    }
}
